/**
 * RadioCarro.java
 * @author Oscar Castañeda, Carnet 11086
 * @author Edwin Xico, Carnet 11090
 * @since 05/07/2012
 * Descripción: Representación del radio de un carro, el cual implementa la
 *              interfaz radio. Es capaz de ser encendido, apagado, cambiar
 *              de banda, avanzar de frecuencia y almacenar 12 estaciones
 *              para cada una de las bandas.
 */

public class RadioCarro implements Radio {

    //**Atributos**
    
    private boolean encendido;       //True si encendido; false, apagado.
    private boolean bandaFM;         //True si FM; false, AM.
    private float estacionActualFM;  
    private int estacionActualAM;
    private float[] estacionesFM;
    private int[] estacionesAM;
    
    
    /**
     * Constructor del radio del carro. Este se crea apagado, sintonizado en FM
     * y con la estación en cada banda en la menor cantidad posible. Además, se
     * inicializa la lista con la memoria de estaciones.
     */
    public RadioCarro(){
        super();
        encendido = false;
        bandaFM = true;
        estacionActualFM = FM_MIN;
        estacionActualAM = AM_MIN;
        estacionesFM = new float[12];
        estacionesAM = new int[12];
        for (int i = 0; i<12; i++){
            estacionesFM[i] = 0;      //Se inicializan ambas listas con valores cero.
            estacionesAM[i] = 0;
        }
    }
    
    /**
     * onOff: Enciende o apaga el radio.
     */
    @Override
    public void onOff() {
        encendido = !encendido;
    }

    /**
     * cambiarBanda: Cambia entre AM y FM.
     */
    @Override
    public void cambiarBanda() {
        if(encendido){
            bandaFM = ! bandaFM;
        }
    }

    /**
     * cambiarFrecuencia: Cambia la frecuencia actual del radio, siendo el cambio
     * y los intervalos en que dicho cambio es válido distintos dependiendo de si
     * la radio está en banda AM o FM.
     */
    @Override
    public void cambiarFrecuencia() {
        if(encendido){
            if(bandaFM){
                estacionActualFM += FM_D;
                if (estacionActualFM > FM_MAX){ //Si pasa el límite del dial,
                    estacionActualFM = FM_MIN;  //se inicia de nuevo.
                }
            }else{
                estacionActualAM += AM_D;
                if (estacionActualAM > AM_MAX){
                    estacionActualAM = AM_MIN;
                }
            }
        }
    }

    /**
     * guardarEstacion: Guarda la estación actual asociándola a uno de 12 botones.
     * @param boton Número del botón asociado a la estación guardada.
     */
    @Override
    public void guardarEstacion(int boton) {
        if (encendido){
            if (bandaFM){
                estacionesFM[boton-1] = estacionActualFM;
            }else{
                if (! bandaFM)
                estacionesAM[boton-1] = estacionActualAM;
            }
        }
    }

    /**
     * seleccionarEstacion: Sintoniza la estación almacenada en el botón presionado.
     * Si no hay almacenado nada, se deja la estación actual.
     * @param boton Número del botón presionado.
     */
    @Override
    public void seleccionarEstacion(int boton) {
        if (encendido){
            if (bandaFM && (estacionesFM[boton-1] != 0)){
                estacionActualFM = estacionesFM[boton-1];
            }else{
                if(!bandaFM && (estacionesAM[boton-1] != 0)){
                    estacionActualAM = estacionesAM[boton-1];
                }
            }
        }
    }

    /**
     * getFrecuencia: Devuelve la frecuencia actual del radio.
     * @return Actual frecuencia sintonizada por el radio.
     */
    @Override
    public float getFrecuencia() {
        if(bandaFM){
            return estacionActualFM;
        }else{
            return estacionActualAM;
        }
    }

    /**
     * isOn: Getter de Encendido.
     * @return True si el radio está encendido; false en caso contrario.
     */
    @Override
    public boolean isOn() {
        return encendido;
    }

    /**
     * isAM: Permite saber si la radio está en la banda AM.
     * @return True si está en AM; false en caso contrario.
     */
    @Override
    public boolean isAM() {
        if (!bandaFM){
            return true;
        }else{
            return false;
        }
    }

    /**
     * isFM: Permite saber si la radio está en la banda FM.
     * @return True si está en FM; false en caso contrario.
     */
    @Override
    public boolean isFM() {
        if (bandaFM){
            return true;
        }else{
            return false;
        }
    }
        
}